package com.library.repository;

import com.library.entity.Book;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

/**
 * 图书数据访问层接口
 * 继承JpaRepository，提供基础的CRUD操作
 * 使用JPA查询方法或自定义JPQL查询
 */
@Repository
public interface BookRepository extends JpaRepository<Book, Long> {
    /**
     * 搜索图书
     * 支持按关键词、分类、推荐状态进行多条件搜索
     * 关键词会在书名、作者、ISBN中模糊匹配
     * 
     * @param keyword 搜索关键词，会在title、author、isbn中搜索
     * @param category 图书分类，精确匹配
     * @param isRecommended 是否推荐，true表示只搜索推荐图书
     * @return 符合条件的图书列表，按创建时间倒序排列
     */
    /**
     * 搜索图书（分页版本）
     */
    @Query("""
    SELECT b FROM Book b 
    WHERE (
        :keyword IS NULL 
        OR (
            (b.title IS NOT NULL AND LOWER(b.title) LIKE LOWER(CONCAT('%', :keyword, '%')))
            OR (b.author IS NOT NULL AND LOWER(b.author) LIKE LOWER(CONCAT('%', :keyword, '%')))
            OR (b.isbn IS NOT NULL AND LOWER(b.isbn) LIKE LOWER(CONCAT('%', :keyword, '%')))
        )
    ) 
    AND (:category IS NULL OR b.category = :category) 
    AND (:isRecommended IS NULL OR b.isRecommended = :isRecommended)
    ORDER BY b.createdAt DESC
""")
    Page<Book> searchBooks(
            @Param("keyword") String keyword,
            @Param("category") String category,
            @Param("isRecommended") Boolean isRecommended,
            Pageable pageable
    );
//    @Query("SELECT b FROM Book b WHERE " +
//            "(:keyword IS NULL OR :keyword = '' OR " +
//            "(b.title LIKE CONCAT('%', :keyword, '%') OR " +
//            "b.author LIKE CONCAT('%', :keyword, '%') OR " +
//            "b.isbn LIKE CONCAT('%', :keyword, '%'))) AND " +
//            "(:category IS NULL OR :category = '' OR b.category = :category) AND " +
//            "(:isRecommended IS NULL OR b.isRecommended = :isRecommended) " +
//            "ORDER BY b.createdAt DESC")
//    List<Book> searchBooks(@Param("keyword") String keyword,
//                           @Param("category") String category,
//                           @Param("isRecommended") Boolean isRecommended);

    /**
     * 获取所有图书分类
     * 返回去重后的分类列表
     * 
     * @return 所有不重复的分类名称列表
     */
    @Query("SELECT DISTINCT b.category FROM Book b WHERE b.category IS NOT NULL")
    List<String> findAllCategories();
    
    /**
     * 根据ISBN查找图书
     * 用于检查ISBN是否已存在
     * 
     * @param isbn ISBN号
     * @return Optional包装的Book对象，如果不存在则返回empty
     */
    Optional<Book> findByIsbn(String isbn);
}
